namespace Server.Items
{
    public class PresetMap : MapItem
    {
        private int m_LabelNumber;

        [Constructable]
        public PresetMap(PresetMapType type)
        {
            int v = (int)type;

            if (v >= 0 && v < PresetMapEntry.Table.Length)
                InitEntry(PresetMapEntry.Table[v]);
        }

        public PresetMap(PresetMapEntry entry)
        {
            InitEntry(entry);
        }

        public void InitEntry(PresetMapEntry entry)
        {
            m_LabelNumber = entry.Name;

            Width = entry.Width;
            Height = entry.Height;

            Bounds = entry.Bounds;
        }

        public override int LabelNumber => (m_LabelNumber == 0 ? base.LabelNumber : m_LabelNumber);

        public PresetMap(Serial serial) : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write(0);

            writer.Write(m_LabelNumber);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            switch (version)
            {
                case 0:
                    {
                        m_LabelNumber = reader.ReadInt();
                        break;
                    }
            }
        }
    }

    public class PresetMapEntry
    {
        private readonly int m_Name;
        private readonly int m_Width, m_Height;
        private Rectangle2D m_Bounds;

        public int Name => m_Name;
        public int Width => m_Width;
        public int Height => m_Height;
        public Rectangle2D Bounds => m_Bounds;

        public PresetMapEntry(int name, int width, int height, int xLeft, int yTop, int xRight, int yBottom)
        {
            m_Name = name;
            m_Width = width;
            m_Height = height;
            m_Bounds = new Rectangle2D(xLeft, yTop, xRight - xLeft, yBottom - yTop);
        }

        private static readonly PresetMapEntry[] m_Table = new PresetMapEntry[]
            {
                new PresetMapEntry( 1041189, 200, 200, 1092, 1396, 1736, 1924 ), // map of Britain
				new PresetMapEntry( 1041203, 200, 200, 0256, 1792, 1736, 2560 ), // map of Britain to Skara Brae
				new PresetMapEntry( 1041192, 200, 200, 1024, 1280, 2304, 3072 ), // map of Britain to Trinsic
				new PresetMapEntry( 1041183, 200, 200, 2500, 1900, 3000, 2400 ), // map of Buccaneer's Den
				new PresetMapEntry( 1041198, 200, 200, 2560, 1792, 3840, 2560 ), // map of Buccaneer's Den to Magincia
				new PresetMapEntry( 1041194, 200, 200, 2560, 1792, 3840, 3072 ), // map of Buccaneer's Den to Ocllo
				new PresetMapEntry( 1041181, 200, 200, 1088, 3572, 1528, 4056 ), // map of Jhelom
				new PresetMapEntry( 1041186, 200, 200, 3530, 2022, 3818, 2298 ), // map of Magincia
				new PresetMapEntry( 1041199, 200, 200, 3328, 1792, 3840, 2304 ), // map of Magincia to Ocllo
				new PresetMapEntry( 1041182, 200, 200, 2360, 0356, 2706, 0702 ), // map of Minoc
				new PresetMapEntry( 1041190, 200, 200, 0000, 0256, 2304, 3072 ), // map of Minoc to Yew
				new PresetMapEntry( 1041191, 200, 200, 2467, 0572, 2878, 0746 ), // map of Minoc to Vesper
				new PresetMapEntry( 1041188, 200, 200, 4156, 0808, 4732, 1528 ), // map of Moonglow
				new PresetMapEntry( 1041201, 200, 200, 3328, 0768, 4864, 1536 ), // map of Moonglow to Nujelm
				new PresetMapEntry( 1041185, 200, 200, 3446, 1030, 3832, 1424 ), // map of Nujelm
				new PresetMapEntry( 1041197, 200, 200, 3328, 1024, 3840, 2304 ), // map of Nujelm to Magincia
				new PresetMapEntry( 1041187, 200, 200, 3582, 2456, 3770, 2742 ), // map of Ocllo
				new PresetMapEntry( 1041184, 200, 200, 2714, 3329, 3100, 3639 ), // map of Serpent's Hold
				new PresetMapEntry( 1041200, 200, 200, 2560, 2560, 3840, 3840 ), // map of Serpent's Hold to Ocllo
				new PresetMapEntry( 1041180, 200, 200, 0524, 2064, 0960, 2452 ), // map of Skara Brae
				new PresetMapEntry( 1041204, 200, 200, 0000, 0000, 5199, 4095 ), // map of The World
				new PresetMapEntry( 1041177, 200, 200, 1792, 2630, 2118, 2952 ), // map of Trinsic
				new PresetMapEntry( 1041193, 200, 200, 1792, 1792, 3072, 3072 ), // map of Trinsic to Buccaneer's Den
				new PresetMapEntry( 1041195, 200, 200, 0256, 1792, 2304, 4095 ), // map of Trinsic to Jhelom
				new PresetMapEntry( 1041178, 200, 200, 2636, 0592, 3064, 1012 ), // map of Vesper
				new PresetMapEntry( 1041196, 200, 200, 2636, 0592, 3840, 1536 ), // map of Vesper to Nujelm
				new PresetMapEntry( 1041179, 200, 200, 0236, 0741, 0766, 1269 ), // map of Yew
				new PresetMapEntry( 1041202, 200, 200, 0000, 0512, 1792, 2048 ), // map of Yew to Britain
                new PresetMapEntry( 0,       200, 200, 600,  3280, 950,  3650 ), // Royal City
                new PresetMapEntry( 0,       200, 200, 900,  3780, 1160, 4060 ), // Holy City
                new PresetMapEntry( 0,       200, 200, 890,  430,  1090, 600  ), // Luna
                new PresetMapEntry( 0,       200, 200, 1920, 1240, 2130, 1430 ), // Umbra
                new PresetMapEntry( 0,       200, 200, 5630, 3080, 5860, 3330 ), // Papua
                new PresetMapEntry( 0,       200, 200, 5140, 3900, 5330, 4094 ), // Deliucia
			};

        public static PresetMapEntry[] Table => m_Table;
    }

    public enum PresetMapType
    {
        Britain,
        BritainToSkaraBrae,
        BritainToTrinsic,
        BucsDen,
        BucsDenToMagincia,
        BucsDenToOcllo,
        Jhelom,
        Magincia,
        MaginciaToOcllo,
        Minoc,
        MinocToYew,
        MinocToVesper,
        Moonglow,
        MoonglowToNujelm,
        Nujelm,
        NujelmToMagincia,
        Ocllo,
        SerpentsHold,
        SerpentsHoldToOcllo,
        SkaraBrae,
        TheWorld,
        Trinsic,
        TrinsicToBucsDen,
        TrinsicToJhelom,
        Vesper,
        VesperToNujelm,
        Yew,
        YewToBritain
    }
}